#ifndef CONTROLCOMMANDGENERATORPLUGIN_H
#define CONTROLCOMMANDGENERATORPLUGIN_H

#include <QObject>
#include "CameraPluginInterface.h"
#include "BinaryProtocolGenerator.h"
#include "FunctionProtocolGenerator.h"
#include "ProtocolConfigManager.h"

class ControlCommandGeneratorPlugin : public CameraPluginInterface {
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
    Q_PROPERTY(QStringList activatedDevices READ activatedDevices CONSTANT)

public:
    Q_INVOKABLE explicit ControlCommandGeneratorPlugin(QObject *parent=nullptr);
    ~ControlCommandGeneratorPlugin() override;
    void initialize() override;
    QString pluginName() const override;
    QString description() const override;


    /**
     * @brief 生成协议指令
     * @param deviceId 设备ID （设备实例的唯一标识）
     * @param deviceName 设备名称（设备类型的唯一标识）
     * @param protocolName 协议名称（生成协议的唯一标识）
     * @param params 参数映射表（键值对形式）
     * @return 是否成功生成指令
     */
    Q_INVOKABLE bool generateProtocolCommand(const QString &deviceId, const QString &deviceName,const QString &protocolName, const QVariantMap &params);

public slots:
    void onPluginMessage(const QString& sender, const QString& message) override;
public:
    /**
     * @brief 激活设备并加载其协议配置文件
     * @param deviceName 设备名称（唯一标识）
     * @return 是否成功激活设备
     * @throws 当设备名称为空或无法找到对应配置文件时抛出异常
     */
    Q_INVOKABLE bool activateDevice(const QString &deviceName);

    /**
     * @brief 停用设备并释放其协议配置
     * @param deviceName 设备名称（唯一标识）
     * @return 是否成功停用设备
     */
    Q_INVOKABLE bool deactivateDevice(const QString &deviceName);

    /**
     * @brief 检查设备是否已激活
     * @param deviceName 设备名称（唯一标识）
     * @return 设备是否已激活
     */
    Q_INVOKABLE bool isDeviceActivated(const QString &deviceName) const;

    // 获取所有已激活设备的ID列表
    Q_INVOKABLE QStringList activatedDevices() const;

private:

    /**
     * @brief 二进制协议生成器指针
     * 用于生成二进制格式的设备控制指令
     */
    BinaryProtocolGenerator *m_binaryGenerator = nullptr;

    /**
     * @brief 函数协议生成器指针
     * 用于生成函数调用格式的设备控制指令
     */
    FunctionProtocolGenerator *m_functionGenerator = nullptr;

    /**
     * @brief 协议配置管理器指针
     * 用于加载、管理和访问设备的协议配置信息
     */
    ProtocolConfigManager *m_configManager = nullptr;

    /**
     * @brief 存储已激活设备的ID和对应的配置文件路径
     * 键为设备ID，值为配置文件路径
     */
    QMap<QString, QString> m_activatedDevices;


};

#endif // CONTROLCOMMANDGENERATORPLUGIN_H
